package br.com.sgbl.dao;

import br.com.sgbl.bean.Cliente;
import br.com.sgbl.utils.Conexao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Luiz
 */
public class ClienteDao {
    
    private static final String SQL_LISTAR =
            "SELECT * FROM cliente";
    private static final String SQL_INSERIR =
            "INSERT INTO cliente (id, nome, cpf, telefone , email, endereco, cidade, uf) VALUES (?,?,?,?,?,?,?,?)";
    private static final String SQL_ALTERAR =
            "UPDATE cliente SET nome = ?, cpf = ?,telefone = ?, email = ?, endereco = ?, cidade = ?, uf = ? WHERE id = ?";
    private static final String SQL_EXCLUIR =
            "DELETE FROM cliente WHERE id = ?";
    
    public Cliente localizar(Connection conn, long codigo) throws SQLException {
        PreparedStatement ps = conn.prepareStatement(SQL_LISTAR + " where id=?");
        ps.setLong(1, codigo);

        ResultSet rs = ps.executeQuery();

        if (rs.first()) {
            Cliente cliente = new Cliente();
            cliente.setId(rs.getLong("id"));
            cliente.setNome(rs.getString("nome"));
            cliente.setCpf(rs.getString("cpf"));
            cliente.setTelefone(rs.getString("telefone"));
            cliente.setEmail(rs.getString("email"));
            cliente.setEndereco(rs.getString("endereco"));
            cliente.setCidade(rs.getString("cidade"));
            cliente.setUf(rs.getString("uf"));

            return cliente;
        } else {
            return null;
        }
    }

    public Cliente salvar(Cliente cliente) throws SQLException {
        if (cliente.getId() == 0) {
            return inserir(cliente);
        } else {
            return alterar(cliente);
        }
    }

    private Cliente inserir(Cliente cliente) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_INSERIR,
                    PreparedStatement.RETURN_GENERATED_KEYS);

            ps.setNull(1, Types.NULL);
            ps.setString(2, cliente.getNome());
            ps.setString(3, cliente.getCpf());
            ps.setString(4, cliente.getTelefone());
            ps.setString(5, cliente.getEmail());
            ps.setString(6, cliente.getEndereco());
            ps.setString(7, cliente.getCidade());
            ps.setString(8, cliente.getUf());


            ps.executeUpdate();

            ResultSet rs = ps.getGeneratedKeys();
            rs.first();

            cliente.setId(rs.getLong("GENERATED_KEY"));

            conn.commit();
        } finally {
            conn.close();
        }

        return cliente;
    }

    private Cliente alterar(Cliente cliente) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_ALTERAR);
            
            //nome = ?, cpf = ?,telefone = ?, email = ?, endereco = ?, cidade = ?, uf = ?

            ps.setString(1, cliente.getNome());
            ps.setString(2, cliente.getCpf());
            ps.setString(3, cliente.getTelefone());
            ps.setString(4, cliente.getEmail());
            ps.setString(5, cliente.getEndereco());
            ps.setString(6, cliente.getCidade());
            ps.setString(7, cliente.getUf());
            ps.setLong(8, cliente.getId());


            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }

        return cliente;
    }

    public List listar() throws SQLException {
        List lista = new ArrayList();

        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_LISTAR);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                Cliente cliente = new Cliente();
                //id, nome, cpf, telefone , email, endereco, cidade, uf

                cliente.setId(rs.getLong("id"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getString("cpf"));
                cliente.setTelefone(rs.getString("telefone"));
                cliente.setEmail(rs.getString("email"));
                cliente.setEndereco(rs.getString("endereco"));
                cliente.setCidade(rs.getString("cidade"));
                cliente.setUf(rs.getString("uf"));
                
                lista.add(cliente);
            }
        } finally {
            conn.close();
        }

        return lista;
    }

    public void excluir(Cliente cliente) throws SQLException {
        Connection conn = Conexao.getConnection();

        try {
            PreparedStatement ps = conn.prepareStatement(SQL_EXCLUIR);

            ps.setLong(1, cliente.getId());

            ps.executeUpdate();

            conn.commit();
        } finally {
            conn.close();
        }
    }
    
}
